package com.sanshengshui.netty.client;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public final class Client {
    public static void main(String[] args) throws Exception {
        //创建了一个 NioEventLoopGroup，它是用于处理 I/O 操作的多线程事件循环组。
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            //使用 Bootstrap 创建了客户端引导类的实例。
            Bootstrap b = new Bootstrap();
            //配置引导类，设置事件循环组、指定使用的通道类型（NioSocketChannel），并设置处理器（ClientInitializer）。
            b.group(group)
                    .channel(NioSocketChannel.class)
                    .handler(new ClientInitializer());
            //使用 connect 方法建立到服务器的连接，并通过 sync 方法等待连接完成。然后，获取连接的通道。
            Channel ch = b.connect("127.0.0.1",8888).sync().channel();

            //循环读取用户输入并发送到服务器：
            ChannelFuture lastWriteFuture = null;
            //使用 BufferedReader 从控制台读取用户输入。
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            for (;;) {
                String line = in.readLine();
                if (line == null) {
                    break;
                }
                //使用 ch.writeAndFlush 将用户输入的消息发送到服务器。消息以 "\r\n" 结尾，可能是为了符合文本协议的要求
                lastWriteFuture = ch.writeAndFlush(line + "\r\n");
                //如果用户输入了 "bye"，则等待服务器关闭连接。
                if ("bye".equals(line.toLowerCase())) {
                    ch.closeFuture().sync();
                    break;
                }
            }

            // Wait until all messages are flushed before closing the channel.
            if (lastWriteFuture != null) {
                //在循环结束后，通过 lastWriteFuture.sync() 确保所有消息都被刷新到远程节点。
                lastWriteFuture.sync();
            }
        } finally {
            //使用 group.shutdownGracefully() 关闭事件循环组，释放所有资源。
            group.shutdownGracefully();
        }
    }
}
